<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

</body>
<script>
    function Set() {
        // 保存集合的元素
        this.items = {};

        // 操作

        // 1.add(value): 添加元素
        Set.prototype.add = function (value) {
            // 判断
            if (this.has(value)) {
                return false;
            }
            this.items[value] = value;
            return true
        }

        // 2.remove(value): 移除某个元素
        Set.prototype.remove = function (value) {
            if (this.has(value)) {
                delete this.items[value]
                return true
            }
            return false;
        }
        // 3.has(value): 判断value是否在集合中
        Set.prototype.has = function (value) {
            return this.items.hasOwnProperty(value);
        }

        // 4.clear(): 清空
        Set.prototype.clear = function (value) {
            this.items = {}
            return true;
        }

        // 5.size(): 长度
        Set.prototype.size = function (value) {
            return Object.keys(this.items).length;
        }
        // 6.values(): 返回包含所有元素的数组
        Set.prototype.values = function () {
            return Object.keys(this.items);
        }

        // 7.并集
        Set.prototype.union = function (otherSet) {
            var newSet = new Set();
            var values = this.values();
            // 将this集合放入newset中
            for (var i = 0; i < values.length; i++) {
                newSet.add(values[i]);
            }
            var otherSetvalues = otherSet.values();
            //将other集合放入newset中
            for (var i = 0; i < otherSetvalues.length; i++) {
                newSet.add(otherSetvalues[i]);
            }
            return newSet;
        }

        // 8.交集

        // 7.并集
        Set.prototype.intersection = function (otherSet) {
            var newSet = new Set();
            var values = this.values();
            // 将this集合放入newset中
            for (var i = 0; i < values.length; i++) {
                if (otherSet.items.hasOwnProperty(values[i])) {
                    newSet.add(values[i]);
                }
            }
            return newSet;
        }

        // 9.差集

        Set.prototype.difference = function (otherSet) {
            var newSet = new Set();
            var values = this.values();
            // 将this集合放入newset中
            for (var i = 0; i < values.length; i++) {
                if (!otherSet.items.hasOwnProperty(values[i])) {
                    newSet.add(values[i]);
                }
            }
            return newSet;
        }
        // 10.子集
        Set.prototype.child = function (otherSet) {
            if (this.size()>otherSet.size()) {
                return false;
            }
            var newSet = new Set();
            var values = this.values();
            // 将this集合放入newset中
            for (var i = 0; i < values.length; i++) {
                if (!otherSet.items.hasOwnProperty(values[i])) {
                    return false;
                }
            }
            return true;
        }
    }


    // var set = new Set();
    // set.add('abc');
    // set.add('abc');
    // set.add('cba');
    // set.add('nba');
    // set.add('mba');
    // console.log(set.values());
    // console.log(set.remove('mba'));
    // console.log(set.remove('mba'));
    // console.log(set.values());
    // console.log(set.size());
    // console.log(set.clear());
    // console.log(set.size());

    var setA = new Set();
    setA.add('aaa');
    setA.add('bbb');
    setA.add('ccc');
    var setB = new Set();
    setB.add('aaa');
    setB.add('fff');
    setB.add('bbb');
    // setB.add('ccc');
    setB.add('eee');
    setB.add('bbb');
    console.log(setA.child(setB));

</script>

</html>